/**  
* @Title: IpUtils.java
* @Package com.lemon.utils
* @Description: (一句话阐述):
* @author Ran_cc
* @date 2018年5月13日
* @version V1.0  
*/
package com.lemon.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Company: </p>
 * @author Ran_cc
 * @date 2018年5月13日
 * @版本 V 1.0 
 */
public class IpUtils {
	/** 
     * 获取当前网络ip 
     * @param request 
     * @return 
     */  
    public static String getIpAddr(HttpServletRequest request){  
        String ipAddress = request.getHeader("x-forwarded-for");  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getHeader("Proxy-Client-IP");  
            }  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getHeader("WL-Proxy-Client-IP");  
            }  
            if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
                ipAddress = request.getRemoteAddr();  
                if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
                    //根据网卡取本机配置的IP  
                    InetAddress inet=null;  
                    try {  
                        inet = InetAddress.getLocalHost();  
                    } catch (UnknownHostException e) {  
                        e.printStackTrace();  
                    }  
                    ipAddress= inet.getHostAddress();  
                }  
            }  
            //对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割  
            if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
                if(ipAddress.indexOf(",")>0){  
                    ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
                }  
            }  
            return ipAddress;   
    }
    
    
    
/*******************************************************************************************************************/
    
    public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";  
    public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$");  
  
    public static String longToIpV4(long longIp) {  
        int octet3 = (int) ((longIp >> 24) % 256);  
        int octet2 = (int) ((longIp >> 16) % 256);  
        int octet1 = (int) ((longIp >> 8) % 256);  
        int octet0 = (int) ((longIp) % 256);  
        return octet3 + "." + octet2 + "." + octet1 + "." + octet0;  
    }  
  
    public static long ipV4ToLong(String ip) {  
        String[] octets = ip.split("\\.");  
        return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16)  
                + (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]);  
    }  
  
    public static boolean isIPv4Private(String ip) {  
        long longIp = ipV4ToLong(ip);  
        return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255"))  
                || (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255"))  
                || longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255");  
    }  
  
    public static boolean isIPv4Valid(String ip) {  
        return pattern.matcher(ip).matches();  
    }  
  
    public static String getIpFromRequest(HttpServletRequest request) {  
        String ip;  
        boolean found = false;  
        if ((ip = request.getHeader("x-forwarded-for")) != null) {  
        	StringTokenizer tokenizer = new StringTokenizer(ip, ",");  
            while (tokenizer.hasMoreTokens()) {  
                ip = tokenizer.nextToken().trim();  
                if (isIPv4Valid(ip) && !isIPv4Private(ip)) {  
                    found = true;  
                    break;  
                }  
            }  
        }  
        if (!found) {  
            ip = request.getRemoteAddr();  
        }  
        return ip;  
    }  
    
}
